/*
 *  Copyright (C) 2009 Antonio Mata Chamorro
 *  
 *  Este programa es software libre: usted puede redistribuirlo y/o modificarlo
 *  bajo los t�rminos de la Licencia P�blica General GNU publicada
 *  por la Fundaci�n para el Software Libre, ya sea la versi�n 3
 *  de la Licencia, o (a su elecci�n) cualquier versi�n posterior.
 *  
 *  Este programa se distribuye con la esperanza de que sea �til, pero 
 *  SIN GARANT�A ALGUNA; ni siquiera la garant�a impl�cita
 *  MERCANTIL o de APTITUD PARA UN PROP�SITO DETERMINADO. 
 *  Consulte los detalles de la Licencia P�blica General GNU para obtener 
 *  una informaci�n m�s detallada. 
 *  
 *  Deber�a haber recibido una copia de la Licencia P�blica General GNU
 *  junto a este programa. 
 *  En caso contrario, consulte <http://www.gnu.org/licenses/>.
 *   
 */
package org.javahispano.javacup.tacticas_aceptadas.amata.com.amata.javacup.tacticas;

import java.util.LinkedList;
import java.util.List;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.modelo.Tactica;
import org.javahispano.javacup.modelo.TacticaDetalle;

import org.javahispano.javacup.tacticas_aceptadas.amata.com.amata.javacup.tacticas.alineacion.AlineacionTierAI;
import org.javahispano.javacup.tacticas_aceptadas.amata.com.amata.javacup.tacticas.detalle.TacticaDetalleBase;
import org.javahispano.javacup.tacticas_aceptadas.amata.com.amata.javacup.tacticas.detalle.TacticaDetalleDefensas;
import org.javahispano.javacup.tacticas_aceptadas.amata.com.amata.javacup.tacticas.detalle.TacticaDetalleDelanteros;
import org.javahispano.javacup.tacticas_aceptadas.amata.com.amata.javacup.tacticas.detalle.TacticaDetallePrecision;
import org.javahispano.javacup.tacticas_aceptadas.amata.com.amata.javacup.tacticas.detalle.TacticaDetalleVelocidad;

/**
 * Clase que implementa la interfaz Tactica construida como un conjunto de AI en
 * distintas capas. La primera de ellas es la AI del equipo ({@link SoccerTeam})
 * que interpreta cual es el momento adecuado para atacar o defender y ordena a
 * los jugadores colocarse en sus posiciones ofensivas o defensivas seg�n el
 * momento. SoccerTeam tambi�n busca las mejores posiciones de pase y ordena a
 * los jugadores ir a ellas.
 * <p/>
 * En otra capa se encuentra la AI de cada uno de los jugadores (
 * {@link SoccerPlayer}). Esta determina cual es el momento adecuado para
 * disparar, acceptar las peticiones de pase de los compa�eros o continuar
 * corriendo con la pelota. Adem�s acepta o ignora las �rdenes dadas por
 * SoccerTeam.
 * <p/>
 * Muchas de las ideas de esta implementaci�n se basaron en el capitulo 4 Sports
 * Simulation de <em>Programming Game AI by Example</em> de Mat Buckland.
 * 
 * @see SoccerTeam
 * @see SoccerPlayer
 * 
 * @author Antonio Mata Chamorro
 * */
public class TacticaTierAI implements Tactica {
	private SoccerMatchConfiguration configuration;
	private SoccerMatch match;

	private TacticaDetalle[] detalles = new TacticaDetalle[] {
			new TacticaDetalleBase(), new TacticaDetalleDefensas(),
			new TacticaDetalleDelanteros(), new TacticaDetallePrecision(),
			new TacticaDetalleVelocidad() };
	private AlineacionTierAI alineaciones = new AlineacionTierAI();
	private boolean started = false;
	private LinkedList<Comando> comandos = new LinkedList<Comando>();
	
	public TacticaDetalle getDetalle() {
		return this.detalles[this.configuration.getIndexDetalle()];
	}

	public Posicion[] getPosicionSaca(SituacionPartido sp) {
		return alineaciones.getKickOffPositions(this.configuration
				.getIndexAlineacion());
	}

	public Posicion[] getPosicionRecive(SituacionPartido sp) {
		return alineaciones.getDefensivePositions(this.configuration
				.getIndexAlineacion());
	}

	public TacticaTierAI() {
		this(new SoccerMatchConfiguration());
	}

	public TacticaTierAI(SoccerMatchConfiguration configuration) {
		this.started = false;
		this.configuration = configuration;
		this.match = new SoccerMatch(configuration);
	}

	public List<Comando> ejecutar(SituacionPartido sp) {
		// vacia la lista de comandos
		comandos.clear();

		if (!started) {
			// log.warning(
			// "TacticaTierAI  Copyright (C) 2009  Antonio Mata Chamorro\n" +
			// "This program comes with ABSOLUTELY NO WARRANTY.\n" +
			// "This is free software, and you are welcome to redistribute it \n"
			// +
			// "under GPL license conditions, see <http://www.gnu.org/licenses/> for details."
			// );

			// inicializamos las capas AI
			SoccerTeam own = new SoccerTeam(match, true, sp, alineaciones
					.getDefensivePositions(this.configuration
							.getIndexAlineacion()), alineaciones
					.getOffensivePositions(this.configuration
							.getIndexAlineacion()));
			SoccerTeam opponent = new SoccerTeam(match, false, sp);

			own.setOppositeTeam(opponent);
			opponent.setOppositeTeam(own);

			own.getGoal().setCenterPosition(Constantes.centroArcoSup);
			own
					.getGoal()
					.setRightPosicion(
							Constantes.posteDerArcoSup
									.moverPosicion(
											-Constantes.DISTANCIA_CONTROL_BALON_PORTERO * 2,
											0));
			own.getGoal().setLeftPosicion(
					Constantes.posteIzqArcoSup.moverPosicion(
							Constantes.DISTANCIA_CONTROL_BALON_PORTERO * 2, 0));

			opponent.getGoal().setCenterPosition(Constantes.centroArcoInf);
			opponent
					.getGoal()
					.setRightPosicion(
							Constantes.posteDerArcoInf
									.moverPosicion(
											-Constantes.DISTANCIA_CONTROL_BALON_PORTERO * 2,
											0));
			opponent.getGoal().setLeftPosicion(
					Constantes.posteIzqArcoInf.moverPosicion(
							Constantes.DISTANCIA_CONTROL_BALON_PORTERO * 2, 0));

			match.setOwnTeam(own);
			match.setOpponentTeam(opponent);

			started = true;
		}

		match.update(sp, comandos);

		// retorna la lista de comandos.
		return comandos;
	}
}
